package docker

//docker swarm
//集群
//官方文档地址 https://docs.docker.com/engine/swarm/
func dockerSwarm(){
	docker swarm --help

	//[root@VM_0_13_centos ~]# docker swarm --help

	Usage:  docker swarm COMMAND

	Manage Swarm

	Commands:
	ca          Display and rotate the root CA
	init        Initialize a swarm  初始化一个集群
	join        Join a swarm as a node and/or manager 加入一个集群
	join-token  Manage join tokens 创建token
	leave       Leave the swarm 离开一个集群
	unlock      Unlock swarm 解锁
	unlock-key  Manage the unlock key
	update      Update the swarm 更新

	Run 'docker swarm COMMAND --help' for more information on a command.
	//[root@VM_0_13_centos ~]#

	docker swarm init --help

	[root@VM_0_13_centos ~]# docker swarm init --help

		Usage:  docker swarm init [OPTIONS]

		Initialize a swarm

		Options:
			地址：类似于广播地址，去监听
		--advertise-addr string                  Advertised address (format: <ip|interface>[:port])
		--autolock                               Enable manager autolocking (requiring an unlock key to
		start a stopped manager)
		--availability string                    Availability of the node ("active"|"pause"|"drain")
		(default "active")
		--cert-expiry duration                   Validity period for node certificates (ns|us|ms|s|m|h)
		(default 2160h0m0s)
		--data-path-addr string                  Address or interface to use for data path traffic (format:
		<ip|interface>)
		--data-path-port uint32                  Port number to use for data path traffic (1024 - 49151). If
		no value is set or is set to 0, the default port (4789) is used.
		--default-addr-pool ipNetSlice           default address pool in CIDR format (default [])
		--default-addr-pool-mask-length uint32   default address pool subnet mask length (default 24)
		--dispatcher-heartbeat duration          Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
		--external-ca external-ca                Specifications of one or more certificate signing endpoints
		--force-new-cluster                      Force create a new cluster from current state
		--listen-addr node-addr                  Listen address (format: <ip|interface>[:port]) (default
		0.0.0.0:2377)
		--max-snapshots uint                     Number of additional Raft snapshots to retain
		--snapshot-interval uint                 Number of log entries between Raft snapshots (default 10000)
		--task-history-limit int                 Task history retention limit (default 5)
	[root@VM_0_13_centos ~]#


	初始化
	docker swarm init --advertise-addr string
	   地址又分为公网和私网 内部走私网


	docker-1创建集群，本身作为一个manager
	docker swarm init --advertise-addr 172.24.82.169 //购买的服务器的私网地址

	获取令牌
	docker swarm join-token manager  获取一段字符串，把该字符串复制，到docker-2服务器中，黏贴，回车
	docker swarm join-token worker


	加入一个节点
	docker swarm join

	docker-2 复制docker-1通过命令docker swarm join-token manager得到的字符串，回车
	this node joined a swarm as a worker 作为一个worker加入到docker-1集群

	然后回到docker-1服务器
	docker node ls  查看节点列表

	现在需要使第三台服务器加入到集群中
	可以通过命令  docker swarm join-token worker 得到一段字符串
	复制上述这段字符串，然后到docker-3服务器
	黏贴，回车
	this node joined a swarm as a worker 作为一个worker加入docker-1集群

	在回到docker-1服务器
	docker node ls  查看节点列表


	然后想docker-4成为一个manager主节点
	在docker-1使用该命令 docker swarm join-token manager,生成一段字符串，复制

	进入到docker-4服务器中
	黏贴docker-1生成的字符串，回车
	this node joined a swarm as a manager

	进入到docker-1服务器中，查看节点
	docker node ls  查看节点列表

	两主两从，集群成功

	停止docker-1中的docker
	systemctl stop docker 停止docekr
	systemctl start docker 启动docker
	然后在docker-4中使用docker nodes ls 发现docker集群已经不能运行了

	重启docker-1中的docker
	systemctl start docker
	使用docker node ls 查看
	发现docker-4已经成为了lead，docker-1成为了从机

	docker-3服务器离开集群
	docker swarm leave 离开集群
	然后让docker-3成为manager主机
	在lead机docker-4中运行命令[并不一定在docker-4的lead服务器，只要是manager管理机就行]
	docker swarm join-token manager
	生成一段token令牌
	然后复制到docker-3服务器，黏贴运行，docker-3成为一台manager管理
	然后在docker-3服务器中使用docker node  ls 查看，现在是三主一从

	在docker-1服务器中停止docker
	systemctl stop docker
	然后在docker-4服务器上运行docker node ls
	然后在docker-3服务器上运行docker node ls
	两台manager服务都可用
	原理，三台主机，停止docker-1，剩余两台，raft协议，大多数存活可用，存活了两台，现在集群能用

	停止docker-3服务中docker，然后在docker-4运行docker node ls 发现已经不可用
	原理：两台主机，停止一台docker-3，剩下一台docker-4，raft协议，大多数存活，剩下的只有一台，找不到，所以不可用

	最后回复docker-1和docekr-3服务
	systemctl start docker





}


//raft协议 一致性协议
//有个raft的动画演示可以去玩玩http://thesecretlivesofdata.com/raft/
func raftFunc(){
	具体算法看官方文档
}


//动态的扩缩容  弹性、扩缩容
func scale(){
	service 自动拥有扩缩容的功能
	docker service --help
			 docker service --help
			Usage:  docker service COMMAND

			Manage services

			Commands:
			创建一个服务
			create      Create a new service
			查看信息
			inspect     Display detailed information on one or more services
			查看日志
			logs        Fetch the logs of a service or task
			ls          List services
			ps          List the tasks of one or more services
			rm          Remove one or more services
			回滚
			rollback    Revert changes to a service's configuration
			动态的扩缩容/扩展
			scale       Scale one or multiple replicated services
			动态更新一个服务
			update      Update a service

			Run 'docker service COMMAND --help' for more information on a command.


		灰度发布：金丝雀发布
	      升级网站且不影响网站使用

		docker service create --help

		创建一个服务，类似docker run 结合 --help
		docker service create -p 8080:80 --name my-nignx nignx

		docker run 容器启动，不具有扩缩容器
		docker service 服务，具有扩缩容器，滚动更新

		docker service ps my-nignx

		docker service ls 查看服务列表

		在三个主服务上，使用命令查找，刚刚是在docker-1创建的服务器，
		docker service ls     REPLICAS 1/1 副本
		可能发现刚刚创建的服务并不一定在docker-1上，这就是随机分布的特点

		现在容器只启动了一个，只有一个副本，现在来到状况，前端访问人数爆增，一个副本压力太大
		一个服务扛不住，现在需要多开几个容器，动态的扩缩容

		更新
		docker service update --help

		//创建副本 创建三个my-nignx副本
		docker service update --replicas 3 my-nignx

		创建成功，然后在4个节点上，使用docker  ps
		可以在这个集群中任意一个节点随机的分布我们的项目
		现在在浏览器上，随便用docker-1-4服务器的ip地址:8080

		在docker-1-4中使用docker ps 查看启动的容器
		使用docker ps 在docker-1-4查看
		最后发现docekr-1中并没有启动my-nginx容器
		复制docker-1服务器的ip地址:8888
		在浏览器中打开
		虽然在docker-1这台服务上并没有启动容器my-nginx，但是浏览器通过该服务器的ip还是访问到了
		只有在这个集群里面，无论使用哪个服务器的ip都可以访问到

		所以，集群就是一个整体
		服务集群中的任意节点都可以访问，服务有多个副本动态扩缩容，实现高可用

		变回一个
		docker service update --replicas 1 my-nignx


		//扩缩容还有一个命令
		docke service scale --help
		docker service scale my-niginx=5


		//删除服务
		docker service rm my-niginx


		//服务副本与全局服务
		刚才创建副本是随机分配的
		我们的manager和worker节点都可以跑项目
		但是我们的项目可以分为两个
		一个是能在全局跑的
			global service with replicas on every node
		一个是只能在副本上跑的
			replicated service with 3 replicas

		如果我的工作节点不想它跑东西，可以让它以工作副本的

		调整service以什么方式运行
		--mode string
		    service mode (replicated or global) default "replicated"

		docker service create --mode replicated --name mysql01 mysql
		docker service create --mode global --name mysql01 mysql




}


//swarm net
func swarmNet(){
	网络模式  PublishMode:ingress

	swarm 中三个重要的网络
	overlay :
		多个服务，跨机器也可以链接起来
	ingress 默认
		特殊的overlay网络，具有负载均衡的功能；ipvs vip[虚拟网络ip]
}


func dockerStack(){
	docker-compose 单机部署项目
		docker-compose up -d filename.yml

	docker stack 部署，集群部署
		docker stack --help
		docker stack deploy filename.yaml 注意查看写法

		百度搜索 docker stack 案例 注意deploy
}

func dockerSecret(){
	安全！配置密码，证书
	docker secret --help
	网上搜案例
}

func dockerConfig(){
	配置
	docker config --help
	网上搜案例
}


